/**
*	OMaster - Cheating Tool OGame
Door: Peter Evers
Datum: 28 November 2007

  Bestand: game.h
  Beschrijving:
  Dit bestand zal gebouwen accepteren en gaan bouwen.
**/

#ifndef GAME_H__
#define GAME_H__

#ifndef _DEBUG
#define _DEBUG
#endif

#include "connect.h"
#include "parser.h"
#include "ConfigFile.h"
#include <iostream>
#include <vector>
#include <cmath>
#include <ctime>

#ifdef _WIN32
#include <windows.h>
#endif

// Messages
#define   RUN_SUCCESS       0x00
#define   RUN_FAILURE       0x01
#define   RUN_SESSION				0x02

#define		CON_SUCCESS				0x00
#define		CON_HOST					0x01		// Kan host niet bereiken
#define		CON_WRONGLOGIN		0x02		// Foutieve invoer username/password
#define		CON_SESSION				0x04		// Sessie verlopen
#define		CON_INTERERROR		0x08

// Taal
#define     LANGUAGE_FILE      "Data/language.dat"
#define     MAX_DOMEIN                            8

#define		TASK_CON_ERROR		0x00
#define		TASK_SIZE_ERROR		0x01
#define		TASK_SUCCESS			0x02
#define		TASK_END_LIST			0x04

#define		TASK_WAIT_RESOURCES	0x80
#define		TASK_BUILD_BUILDING	0x81

#define		RES_SHORT_METAAL		0x01
#define		RES_SHORT_KRISTAL		0x02
#define		RES_SHORT_DEUT			0x04
typedef unsigned int	FLAG;

#define     MAX_SESSION 12

// Sleep function in millisecondes!
void WaitConsole(const double time);

// Clear console function
void ClearConsole();

/**
* Task
*/
struct STask
{
	int type;		// wachten op grondstoffen, wachten op gebouw
	time_t time;	// Tijdsbestek
	int building, id, planet;
};

/**
* Basic gebouw info structure
*/
struct SBuilding
{
    int id;		// id voor post-command
    double dMetaal, dKristal, dDeut;
    float factor;
	
	// wordt alleen gebruikt als gebruiker gebouw/planeet toevoegd!!!
	int planet;
	int userid;		// geeft aan WELK gebouw dit is.
};

/**
* Game klasse
*/
class CGame
{
public:
	CGame();
	~CGame();
	
				// Regelt login
				int StartLogin(char *username, char *password, char *uni, bool speed_server);
				
				// Berekent productie
				bool CalcProduction(int planet);
				// Berekent gebouw-upgrade
				void CalcBuildCost(const int building, const int level, SResources &resources);
				double CalcBuildTime(const int building, const int level, const int planet);
				
				bool AddBuilding(int building, int planet);
				bool RemoveBuilding(const int element);
				int RunBuilder();
				
				// Planeten
				SPlanet *GetPlanet(int planet);
				int GetNumPlanets();
				
				// Tasks!
				int AddTask();
				int ControlTask();
				
				
private:
				// Parser
				CParser m_parser;
				
				// Connection info
				bool m_bOnline;	// True als speler ingelogt is, anders false.
				char m_szSession[MAX_SESSION + 1];
				char m_szUni[256];
				char m_szLanguage[MAX_DOMEIN];
				CConnect m_con;	// Klasse die een verbinding tot stand brengt met server
				
				ConfigFile *m_lang;	// Klasse met taal-pakket
				
				// SPELER-INFO //
				vector<SBuilding> m_vectBuildings;
				vector<SPlanet> m_vectPlanets;
				vector<STask> *m_vectTask;
				int m_tasksize;
				
				// RUN INFO
				bool m_bSpeedServer;
				SResources m_resources;		// Speler resources            
				
				// Productie, berekend of uit pagina gescant!
				double m_dMetaalProd, m_dKristalProd, m_dDeutProd;
};

#endif

